#include <stdio.h>
#include "list.h"
#include <stdlib.h>
#include <stddef.h>
#include <stdint.h>

#define container_of(ptr, type, member) ((type*) ((uintptr_t) (ptr) - offsetof(type, member)))

typedef struct {
    int value;
    struct list_head list; // 链表节点
} Node;

int main() {
    // 创建一个空链表
    struct list_head my_list;
    list_init(&my_list);

    // 插入节点
    for (int i = 0; i < 5; i++) {
        Node* node = (Node*)malloc(sizeof(Node));
        node->value = i;
        // list_add(&node->list, &my_list); // 将节点添加到链表头部
        list_add_tail(&node->list, &my_list); // 将节点添加到链表尾部
    }

    // 遍历链表
    struct list_head* pos;
    list_for_each(pos, &my_list) {
        Node* node = list_entry(pos, Node, list);
        printf("Value: %d\n", node->value);
    }

    // 删除节点
    struct list_head* temp;
    list_for_each_safe(pos, temp, &my_list) {
        Node* node = list_entry(pos, Node, list);
        if (node->value == 2) { // 删除值为 2 的节点
            list_del(pos);
            free(node); // 释放内存
        }
    }

    // 再次遍历链表以确认删除
    printf("After deletion:\n");
    list_for_each(pos, &my_list) {
        Node* node = list_entry(pos, Node, list);
        printf("Value: %d\n", node->value);
    }

    // 清理剩余节点
    list_for_each_safe(pos, temp, &my_list) {
        Node* node = list_entry(pos, Node, list);
        list_del(pos);
        free(node);
    }

    return 0;
}
